home *** CD-ROM | disk | FTP | other *** search
- package javax.swing;
-
- import java.applet.Applet;
- import java.awt.Container;
- import java.awt.Graphics;
- import java.awt.Rectangle;
- import java.awt.Window;
- import java.awt.image.BufferStrategy;
- import java.lang.reflect.Method;
- import java.security.AccessController;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import sun.awt.SubRegionShowable;
- import sun.java2d.SunGraphics2D;
- import sun.security.action.GetPropertyAction;
-
- class BufferStrategyPaintManager extends RepaintManager.PaintManager {
- private static Method COMPONENT_CREATE_BUFFER_STRATEGY_METHOD;
- private static Method COMPONENT_GET_BUFFER_STRATEGY_METHOD;
- private static boolean TRY_FLIP = "true".equals(AccessController.doPrivileged(new GetPropertyAction("swing.useFlipBufferStrategy", "false")));
- private static final Logger LOGGER = Logger.getLogger("javax.swing.BufferStrategyPaintManager");
- private ArrayList<BufferInfo> bufferInfos = new ArrayList(1);
- private boolean painting;
- private boolean showing;
- private int accumulatedX;
- private int accumulatedY;
- private int accumulatedMaxX;
- private int accumulatedMaxY;
- private JComponent rootJ;
- private Container root;
- private int xOffset;
- private int yOffset;
- private Graphics bsg;
- private BufferStrategy bufferStrategy;
- private BufferInfo bufferInfo;
- private boolean disposeBufferOnEnd;
-
- private static Method getGetBufferStrategyMethod() {
- if (COMPONENT_GET_BUFFER_STRATEGY_METHOD == null) {
- getMethods();
- }
-
- return COMPONENT_GET_BUFFER_STRATEGY_METHOD;
- }
-
- private static Method getCreateBufferStrategyMethod() {
- if (COMPONENT_CREATE_BUFFER_STRATEGY_METHOD == null) {
- getMethods();
- }
-
- return COMPONENT_CREATE_BUFFER_STRATEGY_METHOD;
- }
-
- private static void getMethods() {
- AccessController.doPrivileged(new 1());
- }
-
- protected void dispose() {
- SwingUtilities.invokeLater(new 2(this));
- }
-
- private void dispose(List<BufferInfo> var1) {
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.log(Level.FINER, "BufferStrategyPaintManager disposed", new RuntimeException());
- }
-
- if (var1 != null) {
- for(BufferInfo var3 : var1) {
- var3.dispose();
- }
- }
-
- }
-
- public boolean show(Container var1, int var2, int var3, int var4, int var5) {
- synchronized(this) {
- if (this.painting) {
- return false;
- }
-
- this.showing = true;
- }
-
- boolean var10;
- try {
- BufferInfo var6 = this.getBufferInfo(var1);
- BufferStrategy var7;
- if (var6 == null || javax.swing.BufferStrategyPaintManager.BufferInfo.access$500(var6) || !var6.isInSync() || (var7 = var6.getBufferStrategy(false)) == null) {
- return false;
- }
-
- SubRegionShowable var8 = (SubRegionShowable)var7;
- boolean var9 = var6.getPaintAllOnExpose();
- var6.setPaintAllOnExpose(false);
- if (!var8.validateAndShow(var2, var3, var2 + var4, var3 + var5)) {
- this.bufferInfo.setContentsLostDuringExpose(true);
- return false;
- }
-
- var10 = !var9;
- } finally {
- synchronized(this) {
- this.showing = false;
- this.notifyAll();
- }
- }
-
- return var10;
- }
-
- public boolean paint(JComponent var1, JComponent var2, Graphics var3, int var4, int var5, int var6, int var7) {
- if (this.prepare(var1, true, var4, var5, var6, var7)) {
- if (var3 instanceof SunGraphics2D && ((SunGraphics2D)var3).getDestination() == this.root) {
- int var8 = ((SunGraphics2D)this.bsg).constrainX;
- int var9 = ((SunGraphics2D)this.bsg).constrainY;
- if (var8 != 0 || var9 != 0) {
- this.bsg.translate(-var8, -var9);
- }
-
- ((SunGraphics2D)this.bsg).constrain(this.xOffset + var8, this.yOffset + var9, var4 + var6, var5 + var7);
- this.bsg.setClip(var4, var5, var6, var7);
- var1.paintToOffscreen(this.bsg, var4, var5, var6, var7, var4 + var6, var5 + var7);
- this.accumulate(this.xOffset + var4, this.yOffset + var5, var6, var7);
- return true;
- }
-
- this.bufferInfo.setInSync(false);
- }
-
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("prepare failed");
- }
-
- return super.paint(var1, var2, var3, var4, var5, var6, var7);
- }
-
- public void copyArea(JComponent var1, Graphics var2, int var3, int var4, int var5, int var6, int var7, int var8, boolean var9) {
- if (this.prepare(var1, false, 0, 0, 0, 0) && this.bufferInfo.isInSync()) {
- if (var9) {
- Rectangle var10 = var1.getVisibleRect();
- int var11 = this.xOffset + var3;
- int var12 = this.yOffset + var4;
- this.bsg.clipRect(this.xOffset + var10.x, this.yOffset + var10.y, var10.width, var10.height);
- this.bsg.copyArea(var11, var12, var5, var6, var7, var8);
- } else {
- this.bsg.copyArea(this.xOffset + var3, this.yOffset + var4, var5, var6, var7, var8);
- }
-
- this.accumulate(var3 + this.xOffset + var7, var4 + this.yOffset + var8, var5, var6);
- } else {
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("copyArea: prepare failed or not in sync");
- }
-
- if (!this.flushAccumulatedRegion()) {
- this.rootJ.repaint();
- } else {
- super.copyArea(var1, var2, var3, var4, var5, var6, var7, var8, var9);
- }
- }
-
- }
-
- public void beginPaint() {
- synchronized(this) {
- this.painting = true;
-
- while(this.showing) {
- try {
- this.wait();
- } catch (InterruptedException var4) {
- }
- }
- }
-
- if (LOGGER.isLoggable(Level.FINEST)) {
- LOGGER.finest("beginPaint");
- }
-
- this.resetAccumulated();
- }
-
- public void endPaint() {
- if (LOGGER.isLoggable(Level.FINEST)) {
- LOGGER.finest("endPaint: region " + this.accumulatedX + " " + this.accumulatedY + " " + this.accumulatedMaxX + " " + this.accumulatedMaxY);
- }
-
- if (this.painting && !this.flushAccumulatedRegion()) {
- if (!this.isRepaintingRoot()) {
- this.repaintRoot(this.rootJ);
- } else {
- this.resetDoubleBufferPerWindow();
- this.rootJ.repaint();
- }
- }
-
- BufferInfo var1 = null;
- synchronized(this) {
- this.painting = false;
- if (this.disposeBufferOnEnd) {
- this.disposeBufferOnEnd = false;
- var1 = this.bufferInfo;
- this.bufferInfos.remove(var1);
- }
- }
-
- if (var1 != null) {
- var1.dispose();
- }
-
- }
-
- private boolean flushAccumulatedRegion() {
- boolean var1 = true;
- if (this.accumulatedX != Integer.MAX_VALUE) {
- SubRegionShowable var2 = (SubRegionShowable)this.bufferStrategy;
- boolean var3 = this.bufferStrategy.contentsLost();
- if (!var3) {
- var2.show(this.accumulatedX, this.accumulatedY, this.accumulatedMaxX, this.accumulatedMaxY);
- var3 = this.bufferStrategy.contentsLost();
- }
-
- if (var3) {
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("endPaint: contents lost");
- }
-
- this.bufferInfo.setInSync(false);
- var1 = false;
- }
- }
-
- this.resetAccumulated();
- return var1;
- }
-
- private void resetAccumulated() {
- this.accumulatedX = Integer.MAX_VALUE;
- this.accumulatedY = Integer.MAX_VALUE;
- this.accumulatedMaxX = 0;
- this.accumulatedMaxY = 0;
- }
-
- public void doubleBufferingChanged(JRootPane var1) {
- if ((!var1.isDoubleBuffered() || !var1.getUseTrueDoubleBuffering()) && var1.getParent() != null) {
- if (!SwingUtilities.isEventDispatchThread()) {
- 3 var2 = new 3(this, var1);
- SwingUtilities.invokeLater(var2);
- } else {
- this.doubleBufferingChanged0(var1);
- }
- }
-
- }
-
- private void doubleBufferingChanged0(JRootPane var1) {
- BufferInfo var2;
- synchronized(this) {
- while(this.showing) {
- try {
- this.wait();
- } catch (InterruptedException var6) {
- }
- }
-
- var2 = this.getBufferInfo(var1.getParent());
- if (this.painting && this.bufferInfo == var2) {
- this.disposeBufferOnEnd = true;
- var2 = null;
- } else if (var2 != null) {
- this.bufferInfos.remove(var2);
- }
- }
-
- if (var2 != null) {
- var2.dispose();
- }
-
- }
-
- private boolean prepare(JComponent var1, boolean var2, int var3, int var4, int var5, int var6) {
- if (this.bsg != null) {
- this.bsg.dispose();
- this.bsg = null;
- }
-
- this.bufferStrategy = null;
- if (this.fetchRoot(var1)) {
- boolean var7 = false;
- BufferInfo var8 = this.getBufferInfo(this.root);
- if (var8 == null) {
- var7 = true;
- var8 = new BufferInfo(this, this.root);
- this.bufferInfos.add(var8);
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("prepare: new BufferInfo: " + this.root);
- }
- }
-
- this.bufferInfo = var8;
- if (!var8.hasBufferStrategyChanged()) {
- this.bufferStrategy = var8.getBufferStrategy(true);
- if (this.bufferStrategy == null) {
- return false;
- }
-
- this.bsg = this.bufferStrategy.getDrawGraphics();
- if (this.bufferStrategy.contentsRestored()) {
- var7 = true;
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("prepare: contents restored in prepare");
- }
- }
-
- if (var8.getContentsLostDuringExpose()) {
- var7 = true;
- var8.setContentsLostDuringExpose(false);
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("prepare: contents lost on expose");
- }
- }
-
- if (var2 && var1 == this.rootJ && var3 == 0 && var4 == 0 && var1.getWidth() == var5 && var1.getHeight() == var6) {
- var8.setInSync(true);
- } else if (var7) {
- var8.setInSync(false);
- if (!this.isRepaintingRoot()) {
- this.repaintRoot(this.rootJ);
- } else {
- this.resetDoubleBufferPerWindow();
- }
- }
-
- return this.bufferInfos != null;
- }
- }
-
- return false;
- }
-
- private boolean fetchRoot(JComponent var1) {
- boolean var2 = false;
- this.rootJ = var1;
- this.root = var1;
- this.xOffset = this.yOffset = 0;
-
- while(this.root != null && !(this.root instanceof Window) && !(this.root instanceof Applet)) {
- this.xOffset += this.root.getX();
- this.yOffset += this.root.getY();
- this.root = this.root.getParent();
- if (this.root != null) {
- if (this.root instanceof JComponent) {
- this.rootJ = (JComponent)this.root;
- } else if (!this.root.isLightweight()) {
- if (var2) {
- return false;
- }
-
- var2 = true;
- }
- }
- }
-
- return this.root instanceof RootPaneContainer && this.rootJ instanceof JRootPane && this.rootJ.isDoubleBuffered() && ((JRootPane)this.rootJ).getUseTrueDoubleBuffering();
- }
-
- private void resetDoubleBufferPerWindow() {
- if (this.bufferInfos != null) {
- this.dispose(this.bufferInfos);
- this.bufferInfos = null;
- this.repaintManager.setPaintManager((RepaintManager.PaintManager)null);
- }
-
- }
-
- private BufferInfo getBufferInfo(Container var1) {
- for(int var2 = this.bufferInfos.size() - 1; var2 >= 0; --var2) {
- BufferInfo var3 = (BufferInfo)this.bufferInfos.get(var2);
- Container var4 = var3.getRoot();
- if (var4 == null) {
- this.bufferInfos.remove(var2);
- if (LOGGER.isLoggable(Level.FINER)) {
- LOGGER.finer("BufferInfo pruned, root null");
- }
- } else if (var4 == var1) {
- return var3;
- }
- }
-
- return null;
- }
-
- private void accumulate(int var1, int var2, int var3, int var4) {
- this.accumulatedX = Math.min(var1, this.accumulatedX);
- this.accumulatedY = Math.min(var2, this.accumulatedY);
- this.accumulatedMaxX = Math.max(this.accumulatedMaxX, var1 + var3);
- this.accumulatedMaxY = Math.max(this.accumulatedMaxY, var2 + var4);
- }
-
- // $FF: synthetic method
- static Method access$002(Method var0) {
- COMPONENT_CREATE_BUFFER_STRATEGY_METHOD = var0;
- return var0;
- }
-
- // $FF: synthetic method
- static Method access$000() {
- return COMPONENT_CREATE_BUFFER_STRATEGY_METHOD;
- }
-
- // $FF: synthetic method
- static Method access$102(Method var0) {
- COMPONENT_GET_BUFFER_STRATEGY_METHOD = var0;
- return var0;
- }
-
- // $FF: synthetic method
- static Method access$100() {
- return COMPONENT_GET_BUFFER_STRATEGY_METHOD;
- }
-
- // $FF: synthetic method
- static boolean access$200(BufferStrategyPaintManager var0) {
- return var0.showing;
- }
-
- // $FF: synthetic method
- static ArrayList access$300(BufferStrategyPaintManager var0) {
- return var0.bufferInfos;
- }
-
- // $FF: synthetic method
- static ArrayList access$302(BufferStrategyPaintManager var0, ArrayList var1) {
- return var0.bufferInfos = var1;
- }
-
- // $FF: synthetic method
- static void access$400(BufferStrategyPaintManager var0, List var1) {
- var0.dispose(var1);
- }
-
- // $FF: synthetic method
- static void access$600(BufferStrategyPaintManager var0, JRootPane var1) {
- var0.doubleBufferingChanged0(var1);
- }
-
- // $FF: synthetic method
- static Logger access$700() {
- return LOGGER;
- }
-
- // $FF: synthetic method
- static Method access$800() {
- return getGetBufferStrategyMethod();
- }
-
- // $FF: synthetic method
- static boolean access$900() {
- return TRY_FLIP;
- }
-
- // $FF: synthetic method
- static Method access$1000() {
- return getCreateBufferStrategyMethod();
- }
- }
-